import ValidationUtils from './ValidationUtils';
import CommonUtils from '../logics/CommonUtils';
import { BodyItemConstant as BiC } from '../constants/InputItemConstants'

// 共通メッセージ
export const MSG_REQUIRED = '入力してください';          // 必須入力チェックエラー
export const MSG_DIGIT = '半角数字で入力してください';    // 半角数字チェックエラー
export const MSG_ONE_OF = '入力が範囲外です';            // 選択肢チェックエラー

/**
 * 単項目チェック定義
 */
export const SingleValidation = Object.freeze({

  // 性別
  [BiC.GENDER]: {
    label: BiC.GENDER.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.GENDER.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 年齢
  [BiC.AGE]: {
    label: BiC.AGE.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.AGE.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 身長
  [BiC.BODY_HEIGHT]: {
    label: BiC.BODY_HEIGHT.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.BODY_HEIGHT.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 体重
  [BiC.BODY_WEIGHT]: {
    label: BiC.BODY_WEIGHT.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.BODY_WEIGHT.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 喫煙習慣
  [BiC.SMOKING_HABIT]: {
    label: BiC.SMOKING_HABIT.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.SMOKING_HABIT.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 飲酒習慣
  [BiC.ALCOHOL_HABIT]: {
    label: BiC.ALCOHOL_HABIT.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.ALCOHOL_HABIT.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 飲酒頻度
  [BiC.ALCOHOL_FREQUENCY]: {
    label: BiC.ALCOHOL_FREQUENCY.label,
    validations: [
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.ALCOHOL_FREQUENCY.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 飲酒量（ビールまたは発泡酒）
  [BiC.ALCOHOL_AMOUNT_BEER]: {
    label: BiC.ALCOHOL_AMOUNT_BEER.label,
    validations: [
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.ALCOHOL_AMOUNT_BEER.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 飲酒量（ワイン）
  [BiC.ALCOHOL_AMOUNT_WINE]: {
    label: BiC.ALCOHOL_AMOUNT_WINE.label,
    validations: [
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.ALCOHOL_AMOUNT_WINE.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 飲酒量（日本酒）
  [BiC.ALCOHOL_AMOUNT_SAKE]: {
    label: BiC.ALCOHOL_AMOUNT_SAKE.label,
    validations: [
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.ALCOHOL_AMOUNT_SAKE.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 飲酒量（焼酎または泡盛）
  [BiC.ALCOHOL_AMOUNT_SHOCHU]: {
    label: BiC.ALCOHOL_AMOUNT_SHOCHU.label,
    validations: [
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.ALCOHOL_AMOUNT_SHOCHU.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 飲酒量（ウィスキーまたはブランデー）
  [BiC.ALCOHOL_AMOUNT_WHISKEY]: {
    label: BiC.ALCOHOL_AMOUNT_WHISKEY.label,
    validations: [
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.ALCOHOL_AMOUNT_WHISKEY.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 運動習慣（座っている時間）
  [BiC.EXERCISE_TIME_SITTING]: {
    label: BiC.EXERCISE_TIME_SITTING.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.EXERCISE_TIME_SITTING.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 運動習慣（立ったり歩いたりしている時間）
  [BiC.EXERCISE_TIME_STANDING]: {
    label: BiC.EXERCISE_TIME_STANDING.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.EXERCISE_TIME_STANDING.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 運動習慣（肉体労働やスポーツをする時間）
  [BiC.EXERCISE_TIME_LABORING]: {
    label: BiC.EXERCISE_TIME_LABORING.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.EXERCISE_TIME_LABORING.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 塩蔵品（塩辛、たらこ、すじこ）
  [BiC.SALINE_FOOD]: {
    label: BiC.SALINE_FOOD.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.SALINE_FOOD.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 糖尿病の治療
  [BiC.DIABETES_CURE_FLG]: {
    label: BiC.DIABETES_CURE_FLG.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.DIABETES_CURE_FLG.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 血糖値（空腹時）
  [BiC.BLOOD_SUGAR_LEVEL_FASTING]: {
    label: BiC.BLOOD_SUGAR_LEVEL_FASTING.label,
    validations: [
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.BLOOD_SUGAR_LEVEL_FASTING.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 降圧剤
  [BiC.ANTIHYPERTENSIVE_FLG]: {
    label: BiC.ANTIHYPERTENSIVE_FLG.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.ANTIHYPERTENSIVE_FLG.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 最高（収縮期）血圧
  [BiC.MAX_BLOOD_PRESSURE]: {
    label: BiC.MAX_BLOOD_PRESSURE.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: ValidationUtils.digit,
        errorMessage: (label, value) => MSG_DIGIT,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.maxLength(value, 3),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.rangeEqual(value, 70, 210),
        errorMessage: (label, value) => `${label}は70〜210mmHgの範囲で入力してください`,
      },
    ],
  },

  // 最低（拡張期）血圧
  [BiC.MIN_BLOOD_PRESSURE]: {
    label: BiC.MIN_BLOOD_PRESSURE.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: ValidationUtils.digit,
        errorMessage: (label, value) => MSG_DIGIT,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.maxLength(value, 3),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.rangeEqual(value, 30, 130),
        errorMessage: (label, value) => `${label}は30〜130mmHgの範囲で入力してください`,
      },
    ],
  },

  // LDLコレステロール
  [BiC.LDL_CHOLESTEROL]: {
    label: BiC.LDL_CHOLESTEROL.label,
    validations: [
      {
        isRequried: false,
        validate: ValidationUtils.digit,
        errorMessage: (label, value) => MSG_DIGIT,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.maxLength(value, 3),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.rangeEqual(value, 10, 330),
        errorMessage: (label, value) => `${label}は10〜330mg/dlの範囲で入力してください`,
      },
    ],
  },

  // 中性脂肪（トリグゼライド）
  [BiC.TRIGLYCERIDE]: {
    label: BiC.TRIGLYCERIDE.label,
    validations: [
      {
        isRequried: false,
        validate: ValidationUtils.digit,
        errorMessage: (label, value) => MSG_DIGIT,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.maxLength(value, 3),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.rangeEqual(value, 10, 400),
        errorMessage: (label, value) => `${label}は10〜400mg/dlの範囲で入力してください`,
      },
    ],
  },

  // 家族の既往歴（胃がん）
  [BiC.FAMILY_ANAMNESIS_FLG]: {
    label: BiC.FAMILY_ANAMNESIS_FLG.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.FAMILY_ANAMNESIS_FLG.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 抗体検査（ヘリコバクター・ピロリ菌）
  [BiC.HELICOBACTER_PYLORI_FLG]: {
    label: BiC.HELICOBACTER_PYLORI_FLG.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.HELICOBACTER_PYLORI_FLG.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

  // 慢性胃炎
  [BiC.CHRONIC_GASTRITIS_FLG]: {
    label: BiC.CHRONIC_GASTRITIS_FLG.label,
    validations: [
      {
        isRequried: true,
        validate: ValidationUtils.required,
        errorMessage: (label, value) => MSG_REQUIRED,
      },
      {
        isRequried: false,
        validate: (value) => ValidationUtils.oneOf(value, BiC.CHRONIC_GASTRITIS_FLG.getValues()),
        errorMessage: (label, value) => MSG_ONE_OF,
      },
    ],
  },

});

/**
 * 相関チェック種別
 */
export const MultipleValidationCategory = Object.freeze({
  BMI: 'MVC_BMI',                                         // BMI（身長、体重）
  ALCOHOL_FREQUENCY: 'MVC_ALCOHOL_FREQUENCY',             // 飲酒頻度
  ALCOHOL_AMOUNT_SAKE: 'MVC_ALCOHOL_AMOUNT_SAKE',         // 飲酒量（日本酒）
  ALCOHOL_AMOUNT_SHOCHU: 'MVC_ALCOHOL_AMOUNT_SHOCHU',     // 飲酒量（焼酎または泡盛）
  ALCOHOL_AMOUNT_BEER: 'MVC_ALCOHOL_AMOUNT_BEER',         // 飲酒量（ビールまたは発泡酒）
  ALCOHOL_AMOUNT_WHISKEY: 'MVC_ALCOHOL_AMOUNT_WHISKEY',   // 飲酒量（ウィスキーまたはブランデー）
  ALCOHOL_AMOUNT_WINE: 'MVC_ALCOHOL_AMOUNT_WINE',         // 飲酒量（ワイン）
  ALCOHOL_AMOUNT_ALL: 'MVC_ALCOHOL_AMOUNT_ALL',           // 飲酒量（すべて）
  BLOOD_SUGAR_LEVEL: 'MVC_BLOOD_SUGAR_LEVEL',             // 血糖値（空腹時）、血糖値（随時）
  BLOOD_PRESSURE: 'MVC_BLOOD_PRESSURE',                   // 最高血圧、最低血圧
  CHOLESTEROL: 'MVC_CHOLESTEROL',                         // HDLコレステロール、LDLコレステロール、中性脂肪、総コレステロール
});

/**
 * 相関チェック定義
 */
export const MultipleValidation = Object.freeze({

  // BMI
  [MultipleValidationCategory.BMI]: {
    label: 'BMI',
    validations: [
      {
        validate: ({
          [BiC.BODY_HEIGHT]: height,  // 身長
          [BiC.BODY_WEIGHT]: weight,  // 体重
        }) => {
          let bmi = CommonUtils.calcBMI(height, weight);
          // BMIの小数点以下第2位を四捨五入
          bmi = CommonUtils.getFloatFormat(bmi, 1);
          // 15.0 ≦ BMI ≦ 40.0
          return ValidationUtils.rangeEqual(bmi, 15.0, 40.0);
        },
        errorMessage: (label, inputData) => '身長体重の組合わせが適応範囲外です',
      },
    ],
  },

  // 飲酒頻度
  [MultipleValidationCategory.ALCOHOL_FREQUENCY]: {
    label: BiC.ALCOHOL_FREQUENCY.label,
    validations: [
      // 必須入力チェック
      {
        validate: ({
          [BiC.ALCOHOL_HABIT]: habit,               // 飲酒習慣
          [BiC.ALCOHOL_FREQUENCY]: frequency,       // 飲酒頻度
        }) => {
          switch (habit) {
            case BiC.ALCOHOL_HABIT.IS_DRINKING.value:       // 飲む
            case BiC.ALCOHOL_HABIT.STOPPED.value:           // やめた
              // 必須入力チェック
              return ValidationUtils.required(frequency);
            default:                                        // 飲まない
              return true;
          }
        },
        errorMessage: (label, inputData) => MSG_REQUIRED,
      },
    ],
  },

  // 飲酒量（ビールまたは発泡酒）
  [MultipleValidationCategory.ALCOHOL_AMOUNT_BEER]: {
    label: BiC.ALCOHOL_AMOUNT_BEER.label,
    validations: [
      // 必須入力チェック
      {
        validate: ({
          [BiC.ALCOHOL_HABIT]: habit,               // 飲酒習慣
          [BiC.ALCOHOL_FREQUENCY]: frequency,       // 飲酒頻度
          [BiC.ALCOHOL_AMOUNT_BEER]: beer,          // 飲酒量（ビールまたは発泡酒）
          [BiC.ALCOHOL_AMOUNT_WINE]: wine,          // 飲酒量（ワイン）
          [BiC.ALCOHOL_AMOUNT_SAKE]: sake,          // 飲酒量（日本酒）
          [BiC.ALCOHOL_AMOUNT_SHOCHU]: shochu,      // 飲酒量（焼酎または泡盛）
          [BiC.ALCOHOL_AMOUNT_WHISKEY]: whiskey,    // 飲酒量（ウィスキーまたはブランデー）
        }) => {
          const other = [wine, sake, shochu, whiskey];
          switch (habit) {
            case BiC.ALCOHOL_HABIT.IS_DRINKING.value:       // 飲む
            case BiC.ALCOHOL_HABIT.STOPPED.value:           // やめた
              switch (frequency) {
                case BiC.ALCOHOL_FREQUENCY.MONTH_LESS3.value:       // 月1～3日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS2.value:        // 週1～2日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS4.value:        // 週3～4日
                case BiC.ALCOHOL_FREQUENCY.ALMOST_EVERY_DAY.value:  // 週5～6日
                case BiC.ALCOHOL_FREQUENCY.EVERY_DAY.value:         // 毎日
                  // 必須入力チェック（ビールまたは発泡酒が入力済み or 他に入力あり）
                  return ValidationUtils.required(beer) || other.some(amount => ValidationUtils.required(amount));
                default:                                            // 月1日未満
                  return true;
              }
            default:                                        // 飲まない
              return true;
          }
        },
        errorMessage: (label, inputData) => MSG_REQUIRED,
      },
    ],
  },

  // 飲酒量（ワイン）
  [MultipleValidationCategory.ALCOHOL_AMOUNT_WINE]: {
    label: BiC.ALCOHOL_AMOUNT_WINE.label,
    validations: [
      // 必須入力チェック
      {
        validate: ({
          [BiC.ALCOHOL_HABIT]: habit,               // 飲酒習慣
          [BiC.ALCOHOL_FREQUENCY]: frequency,       // 飲酒頻度
          [BiC.ALCOHOL_AMOUNT_BEER]: beer,          // 飲酒量（ビールまたは発泡酒）
          [BiC.ALCOHOL_AMOUNT_WINE]: wine,          // 飲酒量（ワイン）
          [BiC.ALCOHOL_AMOUNT_SAKE]: sake,          // 飲酒量（日本酒）
          [BiC.ALCOHOL_AMOUNT_SHOCHU]: shochu,      // 飲酒量（焼酎または泡盛）
          [BiC.ALCOHOL_AMOUNT_WHISKEY]: whiskey,    // 飲酒量（ウィスキーまたはブランデー）
        }) => {
          const other = [beer, sake, shochu, whiskey];
          switch (habit) {
            case BiC.ALCOHOL_HABIT.IS_DRINKING.value:       // 飲む
            case BiC.ALCOHOL_HABIT.STOPPED.value:           // やめた
              switch (frequency) {
                case BiC.ALCOHOL_FREQUENCY.MONTH_LESS3.value:       // 月1～3日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS2.value:        // 週1～2日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS4.value:        // 週3～4日
                case BiC.ALCOHOL_FREQUENCY.ALMOST_EVERY_DAY.value:  // 週5～6日
                case BiC.ALCOHOL_FREQUENCY.EVERY_DAY.value:         // 毎日
                  // 必須入力チェック（ワインが入力済み or 他に入力あり）
                  return ValidationUtils.required(wine) || other.some(amount => ValidationUtils.required(amount));
                default:                                            // 月1日未満
                  return true;
              }
            default:                                        // 飲まない
              return true;
          }
        },
        errorMessage: (label, inputData) => MSG_REQUIRED,
      },
    ],
  },

  // 飲酒量（日本酒）
  [MultipleValidationCategory.ALCOHOL_AMOUNT_SAKE]: {
    label: BiC.ALCOHOL_AMOUNT_SAKE.label,
    validations: [
      // 必須入力チェック
      {
        validate: ({
          [BiC.ALCOHOL_HABIT]: habit,               // 飲酒習慣
          [BiC.ALCOHOL_FREQUENCY]: frequency,       // 飲酒頻度
          [BiC.ALCOHOL_AMOUNT_BEER]: beer,          // 飲酒量（ビールまたは発泡酒）
          [BiC.ALCOHOL_AMOUNT_WINE]: wine,          // 飲酒量（ワイン）
          [BiC.ALCOHOL_AMOUNT_SAKE]: sake,          // 飲酒量（日本酒）
          [BiC.ALCOHOL_AMOUNT_SHOCHU]: shochu,      // 飲酒量（焼酎または泡盛）
          [BiC.ALCOHOL_AMOUNT_WHISKEY]: whiskey,    // 飲酒量（ウィスキーまたはブランデー）
        }) => {
          const other = [beer, wine, shochu, whiskey];
          switch (habit) {
            case BiC.ALCOHOL_HABIT.IS_DRINKING.value:       // 飲む
            case BiC.ALCOHOL_HABIT.STOPPED.value:           // やめた
              switch (frequency) {
                case BiC.ALCOHOL_FREQUENCY.MONTH_LESS3.value:       // 月1～3日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS2.value:        // 週1～2日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS4.value:        // 週3～4日
                case BiC.ALCOHOL_FREQUENCY.ALMOST_EVERY_DAY.value:  // 週5～6日
                case BiC.ALCOHOL_FREQUENCY.EVERY_DAY.value:         // 毎日
                  // 必須入力チェック（日本酒が入力済み or 他に入力あり）
                  return ValidationUtils.required(sake) || other.some(amount => ValidationUtils.required(amount));
                default:                                            // 月1日未満
                  return true;
              }
            default:                                        // 飲まない
              return true;
          }
        },
        errorMessage: (label, inputData) => MSG_REQUIRED,
      },
    ],
  },

  // 飲酒量（焼酎または泡盛）
  [MultipleValidationCategory.ALCOHOL_AMOUNT_SHOCHU]: {
    label: BiC.ALCOHOL_AMOUNT_SHOCHU.label,
    validations: [
      // 必須入力チェック
      {
        validate: ({
          [BiC.ALCOHOL_HABIT]: habit,               // 飲酒習慣
          [BiC.ALCOHOL_FREQUENCY]: frequency,       // 飲酒頻度
          [BiC.ALCOHOL_AMOUNT_BEER]: beer,          // 飲酒量（ビールまたは発泡酒）
          [BiC.ALCOHOL_AMOUNT_WINE]: wine,          // 飲酒量（ワイン）
          [BiC.ALCOHOL_AMOUNT_SAKE]: sake,          // 飲酒量（日本酒）
          [BiC.ALCOHOL_AMOUNT_SHOCHU]: shochu,      // 飲酒量（焼酎または泡盛）
          [BiC.ALCOHOL_AMOUNT_WHISKEY]: whiskey,    // 飲酒量（ウィスキーまたはブランデー）
        }) => {
          const other = [beer, wine, sake, whiskey];
          switch (habit) {
            case BiC.ALCOHOL_HABIT.IS_DRINKING.value:       // 飲む
            case BiC.ALCOHOL_HABIT.STOPPED.value:           // やめた
              switch (frequency) {
                case BiC.ALCOHOL_FREQUENCY.MONTH_LESS3.value:       // 月1～3日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS2.value:        // 週1～2日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS4.value:        // 週3～4日
                case BiC.ALCOHOL_FREQUENCY.ALMOST_EVERY_DAY.value:  // 週5～6日
                case BiC.ALCOHOL_FREQUENCY.EVERY_DAY.value:         // 毎日
                  // 必須入力チェック（ビールまたは発泡酒が入力済み or 他に入力あり）
                  return ValidationUtils.required(shochu) || other.some(amount => ValidationUtils.required(amount));
                default:                                            // 月1日未満
                  return true;
              }
            default:                                        // 飲まない
              return true;
          }
        },
        errorMessage: (label, inputData) => MSG_REQUIRED,
      },
    ],
  },

  // 飲酒量（ウィスキーまたはブランデー）
  [MultipleValidationCategory.ALCOHOL_AMOUNT_WHISKEY]: {
    label: BiC.ALCOHOL_AMOUNT_WHISKEY.label,
    validations: [
      // 必須入力チェック
      {
        validate: ({
          [BiC.ALCOHOL_HABIT]: habit,               // 飲酒習慣
          [BiC.ALCOHOL_FREQUENCY]: frequency,       // 飲酒頻度
          [BiC.ALCOHOL_AMOUNT_BEER]: beer,          // 飲酒量（ビールまたは発泡酒）
          [BiC.ALCOHOL_AMOUNT_WINE]: wine,          // 飲酒量（ワイン）
          [BiC.ALCOHOL_AMOUNT_SAKE]: sake,          // 飲酒量（日本酒）
          [BiC.ALCOHOL_AMOUNT_SHOCHU]: shochu,      // 飲酒量（焼酎または泡盛）
          [BiC.ALCOHOL_AMOUNT_WHISKEY]: whiskey,    // 飲酒量（ウィスキーまたはブランデー）
        }) => {
          const other = [beer, wine, sake, shochu];
          switch (habit) {
            case BiC.ALCOHOL_HABIT.IS_DRINKING.value:       // 飲む
            case BiC.ALCOHOL_HABIT.STOPPED.value:           // やめた
              switch (frequency) {
                case BiC.ALCOHOL_FREQUENCY.MONTH_LESS3.value:       // 月1～3日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS2.value:        // 週1～2日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS4.value:        // 週3～4日
                case BiC.ALCOHOL_FREQUENCY.ALMOST_EVERY_DAY.value:  // 週5～6日
                case BiC.ALCOHOL_FREQUENCY.EVERY_DAY.value:         // 毎日
                  // 必須入力チェック（ウィスキーまたはブランデーが入力済み or 他に入力あり）
                  return ValidationUtils.required(whiskey) || other.some(amount => ValidationUtils.required(amount));
                default:                                            // 月1日未満
                  return true;
              }
            default:                                        // 飲まない
              return true;
          }
        },
        errorMessage: (label, inputData) => MSG_REQUIRED,
      },
    ],
  },

  // 飲酒量（すべて）
  [MultipleValidationCategory.ALCOHOL_AMOUNT_ALL]: {
    label: '飲酒量',
    validations: [
      // 妥当性チェック
      {
        validate: ({
          [BiC.ALCOHOL_HABIT]: habit,               // 飲酒習慣
          [BiC.ALCOHOL_FREQUENCY]: frequency,       // 飲酒頻度
          [BiC.ALCOHOL_AMOUNT_BEER]: beer,          // 飲酒量（ビールまたは発泡酒）
          [BiC.ALCOHOL_AMOUNT_WINE]: wine,          // 飲酒量（ワイン）
          [BiC.ALCOHOL_AMOUNT_SAKE]: sake,          // 飲酒量（日本酒）
          [BiC.ALCOHOL_AMOUNT_SHOCHU]: shochu,      // 飲酒量（焼酎または泡盛）
          [BiC.ALCOHOL_AMOUNT_WHISKEY]: whiskey,    // 飲酒量（ウィスキーまたはブランデー）
        }) => {
          switch (habit) {
            case BiC.ALCOHOL_HABIT.IS_DRINKING.value:       // 飲む
            case BiC.ALCOHOL_HABIT.STOPPED.value:           // やめた
              switch (frequency) {
                case BiC.ALCOHOL_FREQUENCY.MONTH_LESS3.value:       // 月1～3日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS2.value:        // 週1～2日
                case BiC.ALCOHOL_FREQUENCY.WEEK_LESS4.value:        // 週3～4日
                case BiC.ALCOHOL_FREQUENCY.ALMOST_EVERY_DAY.value:  // 週5～6日
                case BiC.ALCOHOL_FREQUENCY.EVERY_DAY.value:         // 毎日
                  // すべて「未入力」or「飲まない」の場合、エラー
                  return (
                    (ValidationUtils.required(beer) && beer !== BiC.ALCOHOL_AMOUNT_BEER.NO_DRINKING.value) ||
                    (ValidationUtils.required(wine) && wine !== BiC.ALCOHOL_AMOUNT_WINE.NO_DRINKING.value) ||
                    (ValidationUtils.required(sake) && sake !== BiC.ALCOHOL_AMOUNT_SAKE.NO_DRINKING.value) ||
                    (ValidationUtils.required(shochu) && shochu !== BiC.ALCOHOL_AMOUNT_SHOCHU.NO_DRINKING.value) ||
                    (ValidationUtils.required(whiskey) && whiskey !== BiC.ALCOHOL_AMOUNT_WHISKEY.NO_DRINKING.value)
                  );
                default:                                            // 月1日未満
                  return true;
              }
            default:                                        // 飲まない
              return true;
          }
        },
        errorMessage: (label, inputData) => 'いずれかの飲酒量を入力してください',
      },
    ],
  },

  // 血糖値
  [MultipleValidationCategory.BLOOD_SUGAR_LEVEL]: {
    label: '血糖値',
    validations: [
      // 必須入力チェック
      {
        validate: ({
          [BiC.BLOOD_SUGAR_LEVEL_FASTING]: fasting,   // 血糖値（空腹時）
        }) => {
          // どちらも入力なし、または、どちらも入力ありの場合、エラー
          return (
            (ValidationUtils.required(fasting))
          );
        },
        errorMessage: (label, inputData) => '空腹時の血糖をお答えください',
      },
    ],
  },

  // 血圧
  [MultipleValidationCategory.BLOOD_PRESSURE]: {
    label: '血圧',
    validations: [
      // 妥当性チェック
      {
        validate: ({
          [BiC.MAX_BLOOD_PRESSURE]: max,              // 最高血圧
          [BiC.MIN_BLOOD_PRESSURE]: min,              // 最低血圧
        }) => {
          // 最高血圧 ≦ 最低血圧 の場合、エラー
          return (
            ValidationUtils.required(max) && ValidationUtils.required(min) && Number(max) > Number(min)
          );
        },
        errorMessage: (label, inputData) => '最低血圧は最高血圧よりも低い数値で入力してください',
      },
    ],
  },

  // コレステロール
  [MultipleValidationCategory.CHOLESTEROL]: {
    label: 'コレステロール',
    validations: [
      // 必須入力チェック
      {
        validate: ({
          [BiC.HDL_CHOLESTEROL]: hdlCholesterol,      // HDLコレステロール
          [BiC.LDL_CHOLESTEROL]: ldlCholesterol,      // LDLコレステロール
          [BiC.TRIGLYCERIDE]: triglyceride,           // 中性脂肪（トリグゼライド）
        }) => {
          // HDLコレステロール、LDLコレステロール、中性脂肪が片方でも入力なしの場合、エラー
          return (
            (ValidationUtils.required(hdlCholesterol) && ValidationUtils.required(ldlCholesterol) && ValidationUtils.required(triglyceride)) 
          );
          
        },
        errorMessage: (label, inputData) => '入力してください',
      },
    ],
  },

});
